From e8a790c9aae4f77b2847ca59836c4ac62cb04c8e Mon Sep 17 00:00:00 2001 From: "iap10@freefall.cl.cam.ac.uk" Date: Sat, 12 Feb 2005 00:41:23 +0000 Subject: [PATCH] bitkeeper revision 1.1159.259.1 (420d50b3Mu97o7HHZsGGVPlv3ORCOw) Some VT-x software perf counters. Signed-off-by: ian.pratt@cl.cam.ac.uk --- xen/arch/x86/vmx.c | 4 ++++ xen/include/xen/perfc.h | 16 ++++++++++++---- xen/include/xen/perfc_defn.h | 5 +++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index 01bc372041..0d2ebab220 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -685,6 +685,8 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs) if ((error = __vmread(VM_EXIT_REASON, &exit_reason))) __vmx_bug(®s); + perfc_incra(vmexits, exit_reason); + __vmread(IDT_VECTORING_INFO_FIELD, &idtv_info_field); if (idtv_info_field & INTR_INFO_VALID_MASK) { __vmwrite(VM_ENTRY_INTR_INFO_FIELD, idtv_info_field); @@ -729,6 +731,8 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs) __vmx_bug(®s); vector &= 0xff; + perfc_incra(cause_vector, vector); + switch (vector) { #ifdef XEN_DEBUGGER case VECTOR_DB: diff --git a/xen/include/xen/perfc.h b/xen/include/xen/perfc.h index ccf8d2ef9f..cfaef352c8 100644 --- a/xen/include/xen/perfc.h +++ b/xen/include/xen/perfc.h @@ -55,17 +55,25 @@ extern struct perfcounter_t perfcounters; #define perfc_value(x) atomic_read(&perfcounters.x[0]) #define perfc_valuec(x) atomic_read(&perfcounters.x[smp_processor_id()]) -#define perfc_valuea(x,y) atomic_read(&perfcounters.x[y]) +#define perfc_valuea(x,y) \ + { if(y<(sizeof(perfcounters.x)/sizeof(*perfcounters.x))) \ + atomic_read(&perfcounters.x[y]); } #define perfc_set(x,v) atomic_set(&perfcounters.x[0], v) #define perfc_setc(x,v) atomic_set(&perfcounters.x[smp_processor_id()], v) -#define perfc_seta(x,y,v) atomic_set(&perfcounters.x[y], v) +#define perfc_seta(x,y,v) \ + { if(y<(sizeof(perfcounters.x)/sizeof(*perfcounters.x))) \ + atomic_set(&perfcounters.x[y], v); } #define perfc_incr(x) atomic_inc(&perfcounters.x[0]) #define perfc_decr(x) atomic_dec(&perfcounters.x[0]) #define perfc_incrc(x) atomic_inc(&perfcounters.x[smp_processor_id()]) -#define perfc_incra(x,y) atomic_inc(&perfcounters.x[y]) +#define perfc_incra(x,y) \ + { if(y<(sizeof(perfcounters.x)/sizeof(*perfcounters.x))) \ + atomic_inc(&perfcounters.x[y]); } #define perfc_add(x,y) atomic_add((y), &perfcounters.x[0]) #define perfc_addc(x,y) atomic_add((y), &perfcounters.x[smp_processor_id()]) -#define perfc_adda(x,y,z) atomic_add((z), &perfcounters.x[y]) +#define perfc_adda(x,y,z) \ + { if(y<(sizeof(perfcounters.x)/sizeof(*perfcounters.x))) \ + atomic_add((z), &perfcounters.x[y]); } #else /* PERF_COUNTERS */ diff --git a/xen/include/xen/perfc_defn.h b/xen/include/xen/perfc_defn.h index f6868d78b9..ba369f3603 100644 --- a/xen/include/xen/perfc_defn.h +++ b/xen/include/xen/perfc_defn.h @@ -30,3 +30,8 @@ PERFCOUNTER_CPU( shadow_update_va_fail, "shadow_update_va_fail" ) /* STATUS counters do not reset when 'P' is hit */ PERFSTATUS( shadow_l2_pages, "current # shadow L2 pages" ) PERFSTATUS( shadow_l1_pages, "current # shadow L1 pages" ) + +#define VMX_PERF_EXIT_REASON_SIZE 37 +#define VMX_PERF_VECTOR_SIZE 0x20 +PERFCOUNTER_ARRAY(vmexits, "vmexits", VMX_PERF_EXIT_REASON_SIZE ) +PERFCOUNTER_ARRAY(cause_vector, "cause vector", VMX_PERF_VECTOR_SIZE ) -- 2.30.2